iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0

原文連結:Using Control Structures in ABAP

IF條件式

如同大多數的程式語言,ABAP使用 IF / ELSEIF / ELSE作條件判斷,IF附帶的條件若未符合,就會繼續往下判斷,依此類推。並加上ENDIF結束判斷式。注意!每行條件後方都必須附帶句號(.)

IF c_number = 0.
      out->write( `C_NUMBER 等於零`   ).
    ELSEIF c_number > 0.
      out->write( `C_NUMBER 大於零`   ).
    ELSE.
      out->write( `C_NUMBER 小於零`   ).
    ENDIF.

比較運算子 與 邏輯運算子

    CONSTANTS x TYPE i VALUE 1.
    CONSTANTS y TYPE i VALUE 2.

    IF ( x < y AND y < X * 3 ) OR ( x < y * 2 ).
      out->write( `判斷成立` ).
    ELSE.
      out->write( `判斷不成立` ).
    ENDIF.
    
    "判斷成立"

比較運算子:在ABAP中,=會根據所在位置決定是賦值還是比較
邏輯運算子:NOT優先於AND,AND優先於OR

邏輯表達式 與 斷言函數

    DATA x TYPE i VALUE IS INITIAL.

    x = 1.

    IF x IS INITIAL.
      out->write( `X為初始值`  ).
    ELSEIF x IS NOT INITIAL.
      out->write( `X不為初始值`   ).
    ENDIF.
    
    "X不為初始值"

ABAP中有一些比較特殊的邏輯表達式,可以省下不少功,例如:<data object> IS INITIAL:當該物件為初始值則為true,<data object> IS NOT INITIAL則相反。

另外,斷言函數(predicate functions)亦可以回傳布林值,如Contains( )可以比較近似值,line_exists( ) 則用於檢查表格中是否存在特定列。

CASE條件式

CASE c_number.
      WHEN 0.
        out->write( `C_NUMBER 等於零` ).
      WHEN 1.
        out->write( `C_NUMBER 等於一` ).
      WHEN 2.
        out->write( `C_NUMBER 等於二` ).
      WHEN OTHERS.
        out->write( `C_NUMBER 不等於上述數值` ).
    ENDCASE. 

CASE則包含CASE / WHEN / WHEN OTHERS,CASE是被判斷的參數,WHEN則是判斷條件,當CASE與WHEN吻合,即會執行段落內的程式碼,用ENDCASE結束。推薦在有需要的時候,可以用於加強程式閱讀的語意性。

TRY CATCH 例外處理

https://ithelp.ithome.com.tw/upload/images/20240904/20113802IhaHCytQcl.png

例外(exception)是執行時產生的錯誤狀態,我們可以根據錯誤發生的原因,分成系統例外(system exceptions)以及應用例外(application exceptions),沒有對這些例外進行更進一步處理的話,通常容易導致runtime error。

    "模擬變數賦值數字時,故意賦值成字串的錯誤"
    DATA result TYPE i.

    CONSTANTS c_text TYPE string VALUE 'ABC'.

      TRY.
        result = c_text.
        out->write( |賦值結果為 { result }|  ).
      CATCH cx_sy_conversion_no_number.
        out->write( |錯誤: { c_text } 並非數值!| ).
     ENDTRY.

通常使用TRY / CATCH / ENDTRY取得可捕獲的例外事件,另外,透過設置多個CATCH可以一次設定多個捕獲條件。

迴圈

在ABAP中,有三種形式的迴圈:

  1. 特定次數(DO...TIMES) : 對TIMES指定想要遞迴的次數,如設成0就不會執行區段內的程式碼。
    DO c_number TIMES.
      out->write(  `Hello World` ).
    ENDDO.
  1. 特定條件(DO...IF):
    這裡可以設定IF結合EXIT作為跳出迴圈的終止條件(類似while的相反),如果IF內的條件無法到達true則可能造成無窮迴圈。
DATA number TYPE i VALUE 3.
    DATA number_end TYPE i VALUE 0.

    DO.
      out->write( |{ sy-index } Value of number {  number }| ).
      number = number - 1.

      IF number <= number_end.
        EXIT.
      ENDIF.
      
*輸出結果:
"1 Value of number 3"
"2 Value of number 2"
"3 Value of number 1"

註:sy-index為當前迴圈的已跑次數

  1. 基於internal table(LOOP AT):在未來會提及的ABAP表格資料internal table中,這個迴圈方法主要用來讀取表格的值,可以視為ABAP一列一列的讀出表格內的資料,所以表格有幾列,LOOP AT迴圈就會跑幾次。

LOOP AT 的範例明天會再提及,敬請期待~


上一篇
Day07_運算子 & 字串處理
下一篇
Day09_Internal Table
系列文
ABAP 基礎30天學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言